# -*- coding: utf-8 -*-
# Create your views here.

#from django.contrib.auth import authenticate,login, user_logged_in
from Classi180.classificados.models import *
from notas.models import Noticias#, Galeria
from publicidades.models import Publicidade
#from django.conf import settings
#from django.contrib import comments
from django.http import HttpResponseRedirect, HttpResponse, Http404, QueryDict
#from django.core.mail import send_mail
from django.views.decorators.csrf import csrf_protect, csrf_exempt
from django.core.mail import EmailMessage
from django.shortcuts import get_object_or_404, render_to_response, redirect
from django.template import RequestContext, Context, loader
from datetime import date, timedelta
from django.contrib.auth import authenticate, logout, login as authlogin
from django.core import serializers
from classificados.forms import CadastroForm, AnuncioForm
from django.contrib.auth.decorators import login_required
from PIL import Image
import sys, logging
import itertools
from intellect.Intellect import Intellect
from intellect.Intellect import Callable
from settings import MEDIA_ROOT
from django.contrib.comments.models import Comment
import datetime
import random
import math
import locale
#from warnings import catch_warnings
#from test.test_warnings import CatchWarningTests

#from django.db.models.sql.query import Query
#from django.db.models.query import QuerySet
from django.contrib.auth.models import User
from django.views.generic.base import RedirectView
from django.db.models.query import QuerySet
from classificados.models import Pacote, Blog, Contrato
from MySQLdb.times import TimeDelta
from classificados.forms import UsuarioForm
from locale import currency
from decimal import Decimal
from django.forms.fields import DecimalField
from django import template, templatetags
from django.contrib.humanize.templatetags.humanize import intcomma
from django.utils.datastructures import MultiValueDict
from django.utils.regex_helper import contains
from django.core.paginator import InvalidPage, EmptyPage, Paginator
import traceback
from django.contrib import humanize
from django.utils.numberformat import format

#from test.test_getargs2 import Int
#from django.contrib.sessions.models import Session
#from lib2to3.fixer_util import String

def home(request):
    categorias = Categoria.objects.all()
    ultimos = Anuncio.objects.all().order_by('-dataCadastro')[:3]
    acessados = Anuncio.objects.filter(status__exact = 2).order_by('-quantidadeAcesso')[:4]
    destaques = Anuncio.objects.filter(status__exact=3).order_by('-dataCadastro')[:5]
    tags = TagBusca.objects.all().order_by('-quantidade')[:10]
    tagRecomenda = TagBusca.objects.filter(taganuncio__in = TagAnuncio.objects.all()).order_by('-quantidade')[:1]
    recomendado = TagBusca.objects.get(id = tagRecomenda)
    tag = TagBusca.objects.latest('id')
    recomendados = Anuncio.objects.filter(status__exact = 2).filter(taganuncio__tag__exact = recomendado)[:3]
    data = date.today()
    '''XMLSerializer = serializers.get_serializer("xml")
    xml_serializer = XMLSerializer()
    xml_serializer.serialize(Anuncio.objects.filter(status__exact=3))
    dataXML = xml_serializer.getvalue()
    print dataXML
    with open("D:/Desenvolvimento/Projetos/Classi180/Classi180/classificados/file.xml", "w") as out:
        xml_serializer.serialize(Anuncio.objects.filter(status__exact=3), stream=out)'''
    noticias = Noticias.objects.all().order_by('-publicacao')[:6]
    publicidades = Publicidade.objects.filter(tipo__exact = 0).order_by('-dataEntrada')[:4]
    publicidadeExtra = Publicidade.objects.filter(tipo__exact= 1).order_by('-dataEntrada')[:1]
    publicidadeIlha = Publicidade.objects.filter(tipo__exact = 2).order_by('-dataEntrada')[:1]
    publicidadeGigante = Publicidade.objects.filter(tipo__exact = 3).order_by('-dataEntrada')[:1]
    publicidadeParceiro = Publicidade.objects.filter(tipo__exact = 4).order_by('-dataEntrada')[:1]
    subCategoriaProduto = SubCategoria.objects.filter(categoria__exact=1).order_by('nome')
    subCategoriaVeiculo = SubCategoria.objects.filter(categoria__exact=2).order_by('nome')
    subCategoriaImoveis = SubCategoria.objects.filter(categoria__exact=3).order_by('nome')
    subCategoriaNegocio = SubCategoria.objects.filter(categoria__exact=4).order_by('nome')
    listaCidades = listagemCidades(request)
    #listaCidades = Cidade.objects.filter(estado__exact = 'PI').order_by('nome')
    #sessao = Session.objects.get(session_key = request.COOKIES['sessionid'])
    return render_to_response('index.html', locals(), context_instance=RequestContext(request))


def relacionaAnuncio(anuncio_id):
    anuncio = Anuncio.objects.get(id = anuncio_id)
    tags = TagBusca.objects.filter(taganuncio__anuncio__exact = anuncio_id).values_list('tag')
    quantidadeBase = tags.count()
    anuncios = Anuncio.objects.filter(taganuncio__tag__tag__in = tags).exclude(id__exact = anuncio_id)
    arrayQuantidade = []
    for anuncioRelacionado in anuncios:
        arrayQuantidade.append([anuncioRelacionado, (quantidadeBase - Anuncio.objects.filter(id__exact = anuncioRelacionado.id ,taganuncio__tag__tag__in = tags).count())])
    
    arrayQuantidade.sort(cmp=compara)
    '''print 'O Anuncio mais parecido eh o '+str(arrayQuantidade[0][0].descricao)+' por necessitar de '+str(arrayQuantidade[0][1])+' inversoes'
    print tags
    print arrayQuantidade
    print anuncios'''
    return anuncios[:5]

@csrf_protect
def anuncio(request, anuncio_id):    
    anuncio = Anuncio.objects.get(id = anuncio_id)
    usuario = Usuario.objects.get(id = anuncio.usuario.id)
    imagens = Imagem.objects.filter(anuncio__exact = anuncio_id)
    anuncios = usuario.anuncio_set.exclude(id__exact = anuncio_id)[:2]
    destaques = Anuncio.objects.filter(status__exact=3)[:7]
    relacionados = relacionaAnuncio(anuncio_id)
    noticias = Noticias.objects.all().order_by('-publicacao')[:3]
    listaCidades = listagemCidades(request)
    anuncio.quantidadeAcesso = anuncio.quantidadeAcesso + 1
    anuncio.save()
    usuario.quantidadeAcesso = usuario.quantidadeAcesso + 1
    usuario.save()
    comentariosAnuncio = Comment.objects.filter(content_type__exact = 14).filter(object_pk__exact = anuncio_id)
    coments = []
    for coment in comentariosAnuncio:
        comentComent = Comment.objects.filter(content_type__exact = 20).filter(object_pk__exact = coment.id)
        coments.append(comentComent)
    
    if request.method == 'POST':
        comentario = Comment(content_type_id = 14, object_pk = anuncio_id, site_id = 2, user_id = request.user.id, user_name = request.user.username, user_email = request.user.email, comment = request.POST['comentText'], submit_date = datetime.date.today(), is_public = 1, is_removed = 0)
        comentario.save()
        return HttpResponseRedirect('/anuncio/'+str(anuncio_id)) 
        
        
    return render_to_response('produto.html', locals(), context_instance=RequestContext(request))

@csrf_protect
def perfil(request, usuario_id):
    
    usuario = Usuario.objects.get(id = usuario_id)
    anuncios = usuario.anuncio_set.all()[:27]
    ultimos = Anuncio.objects.all().order_by('-dataCadastro')[:3]
    noticias = Noticias.objects.all().order_by('-publicacao')[:3]
    listaCidades = listagemCidades(request)
    quantidadeAnuncios = anuncios.count()
    usuario.quantidadeAcesso = usuario.quantidadeAcesso + 1
    usuario.save()
    if request.method == 'POST':
        nota = request.POST['avaliacao']
        usuario = Usuario.objects.get(id = usuario_id)
        usuario2 = Usuario.objects.get(email = request.user.email)
        if nota >=3:
            avaliacaoUser = AvaliacaoUsuario(avaliado = usuario, avaliacaoPositiva = True, avaliacaoNegativa = False, avaliador = usuario2, media = nota)
        else:
            avaliacaoUser = AvaliacaoUsuario(avaliado = usuario, avaliacaoPositiva = False, avaliacaoNegativa = True, avaliador = usuario2, media = nota)
        avaliacaoUser.save()
        
    return render_to_response('perfil.html', locals(), context_instance=RequestContext(request))


def listar(request, categoria_id):    
    anunciosCategoria = Anuncio.objects.filter(categoria__exact = categoria_id)
    categoria = Categoria.objects.get(id = categoria_id)
    subcategorias = categoria.subcategoria_set.all().order_by('nome')
    quantidadeCategoria = anunciosCategoria.count()
    publicidadeGigante = Publicidade.objects.filter(tipo__exact = 3).order_by('-dataEntrada')[:1]
    listaCidades = listagemCidades(request)
    listagemSub = []
    quantidadeSub = []
    for sub in subcategorias:
        queryAtual = anunciosCategoria.filter(subcategoria__exact = sub)
        listagemSub.append(queryAtual)
        quantidadeSub.append(queryAtual.count())
    
    destaques = Anuncio.objects.filter(status__exact=3)[:7]
    ids = anunciosCategoria.values_list('id', flat = True)
    tags = TagBusca.objects.filter(taganuncio__anuncio__in = ids).order_by('tag')[:35]
    cidades = Cidade.objects.filter(id__in = anunciosCategoria.values_list('cidade',flat = True))
    paginator = Paginator(anunciosCategoria, 10)

    try:
        page = int(request.GET.get('page', '1'))
    except ValueError:
        page = 1

    try:
        anunciosCategoria = paginator.page(page)
    except (EmptyPage, InvalidPage):
        anunciosCategoria = paginator.page(paginator.num_page)
    
    return render_to_response('listagem.html', locals(), context_instance=RequestContext(request))

def lista(request, categoria_id, subcategoria_id):    
    anunciosCategoria = Anuncio.objects.filter(subcategoria__exact = subcategoria_id)
    categoria = Categoria.objects.get(id = categoria_id)
    subcategorias = categoria.subcategoria_set.all().order_by('nome')
    quantidadeCategoria = anunciosCategoria.count()
    listaCidades = listagemCidades(request)
    listagemSub = []
    quantidadeSub = []
    for sub in subcategorias:
        queryAtual = anunciosCategoria.filter(subcategoria__exact = sub)
        listagemSub.append(queryAtual)
        quantidadeSub.append(queryAtual.count())
    
    destaques = Anuncio.objects.filter(status__exact=3)[:7]
    ids = anunciosCategoria.values_list('id', flat = True)
    tags = TagBusca.objects.filter(taganuncio__anuncio__in = ids).order_by('tag')[:35]
    cidades = Cidade.objects.filter(id__in = anunciosCategoria.values_list('cidade',flat = True))
    publicidadeGigante = Publicidade.objects.filter(tipo__exact = 3).order_by('-dataEntrada')[:1]
    paginator = Paginator(anunciosCategoria, 10)

    try:
        page = int(request.GET.get('page', '1'))
    except ValueError:
        page = 1

    try:
        anunciosCategoria = paginator.page(page)
    except (EmptyPage, InvalidPage):
        anunciosCategoria = paginator.page(paginator.num_page)
    
    return render_to_response('listagem.html', locals(), context_instance=RequestContext(request))

def busca(request):
    if request.method == 'GET':
        tagg = request.GET['busca']
        try:
            buscaObjeto = TagBusca.objects.get(tag = tagg)
        except:
            buscaObjeto = TagBusca(tag = tagg)
            
        tipo = ''
        categoria_id = ''
        subcategoria_id = ''
        min = ''
        max = ''
        tagbusca = ''
        cidade = ''
        anuncios = Anuncio.objects.filter(descricao__icontains = tagg)
        if request.GET.has_key('tipo') and request.GET['tipo']!= '':
            tipo = request.GET['tipo']
            anuncios = anuncios.filter(tipo__exact = tipo)
        if request.GET.has_key('categoria_id') and request.GET['categoria_id']!= '':
            categoria_id = request.GET['categoria_id']
            anuncios = anuncios.filter(categoria__exact = categoria_id)
        if request.GET.has_key('subcategoria_id') and request.GET['subcategoria_id']!= '':
            subcategoria_id = request.GET['subcategoria_id']
            anuncios = anuncios.filter(subcategoria__exact = subcategoria_id)
        if request.GET.has_key('min') and request.GET['min']!= '':
            min = float(request.GET['min'])
            anuncios = anuncios.filter(preco__gte = min)
        if request.GET.has_key('max') and request.GET['max']!= '':
            max = float(request.GET['max'])
            anuncios = anuncios.filter(preco__lte = max)
        if request.GET.has_key('tagbusca') and request.GET['tagbusca']!= '':
            tagbusca = request.GET['tagbusca']
            anuncios = anuncios.filter(taganuncio__tag__tag__icontains = tagbusca)
        if request.GET.has_key('cidade') and request.GET['cidade']!= '':
            cidade = request.GET['cidade']
            anuncios = anuncios.filter(cidade__exact = cidade)
        
        listagemSub = []
        quantidadeSub = []
        ids = anuncios.values_list('id', flat = True)
        tags = TagBusca.objects.filter(taganuncio__anuncio__in = ids).order_by('tag')[:35]
        cidades = Cidade.objects.filter(id__in = anuncios.values_list('cidade',flat = True))
        publicidadeGigante = Publicidade.objects.filter(tipo__exact = 3).order_by('-dataEntrada')[:1]
        listaCidades = listagemCidades(request)
        buscaObjeto.quantidade = buscaObjeto.quantidade + 1
        buscaObjeto.save()
        quantidadeBusca = anuncios.count()
        destaques = Anuncio.objects.filter(status__exact=3)[:7]
        paginator = Paginator(anuncios, 10)

        try:
            page = int(request.GET.get('page', '1'))
        except ValueError:
            page = 1
    
        try:
            anuncios = paginator.page(page)
        except (EmptyPage, InvalidPage):
            anuncios = paginator.page(paginator.num_page)
    
    return render_to_response('resultadoBusca.html', locals(), context_instance=RequestContext(request))

def cadastrarUser(request):
    
    cidades = Cidade.objects.all()
    listaCidades = listagemCidades(request)
    c = None

    if request.method == 'POST':
        form = UsuarioForm(request.POST, request.FILES)
        print request.POST
        print form
        if form.is_valid():
            novo_usuario = form.save()
            email = request.POST['email']
            html_content = "<a href='www.classi180.com'><img alt='cadastro.jpg' src='http://classi180.com/media/imagens/logo.png'/></a><br><h2>O Seu Cadastro foi realizado no Classi180.com!</h2><p>Caso realmente tenha feito o cadastro, confirme no link abaixo</p></br><li><a href='http://classi180.com/confirmar_cadastro/"+str(novo_usuario.id)+"/'>Confirmar Cadastro</a></li><li>Senao, clique neste link:<a href='http://classi180.com/recusar_cadastro/"+str(novo_usuario.id)+"/'>Recusar Cadastro</a></li>"
            msge = EmailMessage('Cadastro efetuado com sucesso!',html_content,'anuncio.classi180@gmail.com', [email, ] )
            msge.content_subtype = "html"
            msge.send()
            usuario = novo_usuario
            return render_to_response('cadastroConcluido.html',locals(), context_instance=RequestContext(request))
    else:
        form = UsuarioForm()

    return render_to_response('cadastrarUser.html', locals(), context_instance=RequestContext(request))
    

def confirmarCadastro(request, usuario_id):
    usuario = User.objects.get(id = usuario_id)
    listaCidades = listagemCidades(request)
    if usuario.is_active == False:
        usuario.is_active = True
        usuario.save()
    return render_to_response('cadastroConcluido.html',locals(), context_instance=RequestContext(request))

def rejeitarCadastro(request, usuario_id):
    usuario = User.objects.get(id = usuario_id)
    listaCidades = listagemCidades(request)
    if usuario.user.is_active == False:
        usuario.usuario.delete()
        usuario.delete()
    return render_to_response('cadastroConcluido.html',locals(), context_instance=RequestContext(request))
    

@csrf_protect
def anunciar(request):
    listaCidades = listagemCidades(request)
    publicidadeGigante = Publicidade.objects.filter(tipo__exact = 3).order_by('-dataEntrada')[:1]
    if request.user.is_authenticated():
        if request.user.is_active:
            if request.method == 'POST':
                categoriaAnuncio = Categoria.objects.get(id = request.POST['categoria'])
                request.POST['categoria'] = categoriaAnuncio
                form = CadastroForm(request.POST, request.FILES)
                if form.is_valid():
                    novo_anuncio = form.save()
                    return render_to_response('index.html',locals(), context_instance=RequestContext(request))
            else:
                categorias = Categoria.objects.all()
                subcategorias = SubCategoria.objects.all()
                msg = "Ocorreu um erro!"
                form = CadastroForm()
                return render_to_response('anunciar.html', locals(), context_instance=RequestContext(request))
    else:
        return HttpResponseRedirect('/cadastrarUser/')
    
@csrf_protect
def anuncia(request): 
    listaCidades = listagemCidades(request)
    if request.method == 'POST':
        categoriaAnuncio = Categoria.objects.get(id = request.POST['categoria'])
        subcategoriaAnuncio = SubCategoria.objects.get(id = request.POST['subcategoria'])
        if request.user.id:
            try:
                usuarioAnuncio = Usuario.objects.get(email = request.user.email)
            except:
                usuarioAnuncio = Usuario.objects.get(nome = request.user.username)
            anuncioNovo = Anuncio(categoria = categoriaAnuncio, subcategoria = subcategoriaAnuncio, usuario = usuarioAnuncio, status =1, cidade = usuarioAnuncio.cidade, descricao = request.POST['descricao'], tipo = request.POST['tipo'], detalhes = request.POST['detalhes'], preco = float(request.POST['preco']),video = request.POST['video'],foto = request.FILES['foto'])
        else:
            anuncioNovo = Anuncio(categoria = categoriaAnuncio, subcategoria = subcategoriaAnuncio, descricao = request.POST['descricao'], tipo = request.POST['tipo'], detalhes = request.POST['detalhes'], preco = request.POST['preco'],video = request.POST['video'],foto = request.FILES['foto'])
        
        anuncioNovo.save()

        # set up logging
        
        intellect = MyIntellect()
        intellect.learn(anuncioNovo)
        bad_word = Proibidas.objects.all()

        for bad in bad_word:
            arquivoDSL = """
from classificados.models import Anuncio, Proibidas
from classificados.Expressao import valida
import logging
rule """+bad.palavra+""":
    when:
        $anuncioNovo := Anuncio((valida('"""+bad.palavra +"""', titulo) or valida('"""+bad.palavra +"""', texto)) and (not is_modified or """+bad.acao+""" < estado))
        # mark the 'ClassB' matches in memory as modified
    then:
        print "entrou"
        print "O titulo eh "+$anuncioNovo.descricao
        print "O titulo eh "+$anuncioNovo.titulo
        modify $anuncioNovo:
            $anuncioNovo.status = """+bad.acao+"""
            $anuncioNovo.modified = 1
            valor = $anuncioNovo.status
            print $anuncioNovo.status
            print "valor = {0}".format( valor )
            # call MyIntellect's bar method as it is decorated as callable
            log("rule_a fired")
"""
            policy = intellect.learn(arquivoDSL)
        intellect.reason()
        intellect.forget_all()
        anuncioThumb = anuncioNovo#Anuncio.objects.latest('id')
        try:
            extensao = anuncioThumb.foto.name.split('.')[-1]
            anuncioThumb.thumbnail = 'anuncio/%s/%s/%s.%s'%(anuncioThumb.categoria.id,anuncioThumb.subcategoria.id,anuncioThumb.id, extensao)
            miniatura = Image.open(anuncioThumb.foto.path)
            miniatura.thumbnail((150,100), Image.ANTIALIAS)
            string = MEDIA_ROOT+''+'/'+anuncioThumb.thumbnail.name
            miniatura.save(string)
            anuncioThumb.preco = float(intcomma(anuncioThumb.preco))
            anuncioThumb.save()
        except:
            anuncioThumb.thumbnail = anuncioThumb.foto
            
        for arquivo in request.FILES.getlist('foto'):
            imagem = Imagem(nome = arquivo, anuncio = anuncioThumb, foto = arquivo)
            imagem.save()
        marcador = 0
        for tag in TagBusca.objects.filter(quantidade__gte = 0):
            if tag.tag in anuncioThumb.descricao.split():
                tag.quantidade = tag.quantidade + 1
                tag.save()
                anuncioT = TagAnuncio(anuncio = anuncioThumb, tag = tag)
                anuncioT.save()
                marcador = 1
        if marcador == 0:
            for ta in anuncioThumb.descricao.split():
                if len(ta) > 2:
                    anuncioBus = TagBusca(tag = ta, quantidade = 1)
                    anuncioBus.save()
                    anuncioTag = TagAnuncio(anuncio = anuncioThumb, tag = anuncioBus)
                    anuncioTag.save()
        pacotes = Pacote.objects.all()
        blogs = Blog.objects.all()
        list = [3,4]
        return render_to_response('anuncio_publicado.html', locals(), context_instance=RequestContext(request))
    else:
        categorias = Categoria.objects.all()
        subcategorias = SubCategoria.objects.all()
        form = CadastroForm()
        return render_to_response('anunciar.html', locals(), context_instance=RequestContext(request))

def compara(elem1, elem2):
    if elem1[1] < elem2[1]:
        return -1
    else:
        if elem1[1] > elem2[1]:
            return 1
        else:
            return 0

def calculaRelacao(usuario_id):
    avaliacaoUser = AvaliacaoUsuario.objects.filter(avaliador__exact = usuario_id)
    avaliadores = AvaliacaoUsuario.objects.exclude(avaliador__exact = usuario_id, avaliado__in = avaliacaoUser.values_list('avaliado'))
    arrayAvaliacao = []
    quantidadeDistancia = []
    media = 0
    distancia = 0
    for avaliador in avaliadores:
        objetoAvaliado = avaliacaoUser.get(avaliado = avaliador.avaliado)
        if arrayAvaliacao.count(avaliador.avaliador) == 0:
            arrayAvaliacao.append(avaliador.avaliador)
            quantidadeDistancia.append([avaliador.avaliador,math.fabs(avaliador.media - objetoAvaliado.media)])
        else:
            media = (quantidadeDistancia[arrayAvaliacao.index(avaliador.avaliador)][1])**2 + (math.fabs(avaliador.media - objetoAvaliado.media))**2
            distancia = math.sqrt(media)
            quantidadeDistancia[arrayAvaliacao.index(avaliador.avaliador)][1] = distancia
        '''print objetoAvaliado
        print avaliador
        print quantidadeDistancia
        print media
        print distancia'''
    quantidadeDistancia.sort(cmp=compara)
    print 'O Usuario com o perfil mais parecido eh: '+str(quantidadeDistancia[0][0].nome)+' Com A distancia de: '+str(quantidadeDistancia[0][1])    
    return quantidadeDistancia[0][0]


@csrf_protect
def destacar(request, anuncio_id):
    listaCidades = listagemCidades(request)   
    pacotes = Pacote.objects.values_list('id',flat=True)
    total = 0
    for i in pacotes:
        if ('check_opc'+str(i)) in request.POST:
            if i in [3,4]:
                cont = 0
                for qtd in range(1, int(request.POST['quantidade'+str(i)])+1):
                    c = Contrato(pacote_id = i, anuncio_id = anuncio_id, semanas = int(request.POST['semanaInterno'+str(i)+str(qtd)]), blog_id = int(request.POST['blogInterno'+str(i)+str(qtd)]))
                    c.save()
                    c.dataSaida = date.today() + timedelta(int(request.POST['semana'+str(i)]) * 8)
                    c.save()
                    total = total + c.valor
                    cont = cont + 1
                
            else:    
                c = Contrato(pacote_id = i, anuncio_id = anuncio_id, semanas = int(request.POST['semana'+str(i)]), blog = None)
                c.save()
                c.dataSaida = date.today() + timedelta(int(request.POST['semana'+str(i)]) * 8)
                c.save()
                total = total + c.valor
    
    inc = "%.2f" % total
    anuncio = Anuncio.objects.get(id = anuncio_id)
    usuario = Usuario.objects.get(id = anuncio.usuario.id)
    
    return render_to_response('pagamento.html', locals(), context_instance=RequestContext(request)) 

@csrf_protect
def login(request):
    listaCidades = listagemCidades(request)
    if request.user.is_authenticated():
        try:
            attrEmail = request.user.username
            usuario = Usuario.objects.get(nome = attrEmail)
        except:
            attrEmail = request.user.email
            usuario = Usuario.objects.get(email = attrEmail)
        anuncios = Anuncio.objects.filter(usuario__exact=usuario)
        quantidadeAnuncio = anuncios.count()
        tagRecomenda = TagBusca.objects.filter(taganuncio__in = TagAnuncio.objects.all()).order_by('-quantidade')[:1]
        recomendado = TagBusca.objects.get(id = tagRecomenda)
        recomendados = Anuncio.objects.filter(taganuncio__tag__exact = recomendado)[:3]
        #if request.user.blog_set.get():
        #    temblog = 1
        ultimos = Anuncio.objects.all().order_by('-dataCadastro')[:3]
        #userRelacionado = calculaRelacao(usuario.id)
        noticias = Noticias.objects.all().order_by('-publicacao')[:3]
        return render_to_response('meu_perfil.html', locals(), context_instance=RequestContext(request))
    
    if request.POST:
        emailUser = request.POST['username']
        senhaUser = request.POST['password']
        u = authenticate(username=emailUser, password=senhaUser)
        if u is not None:
            if u.is_active:
                authlogin(request, u)
                try:
                    usuario = Usuario.objects.get(email = u.email)
                except:
                    usuario = Usuario.objects.get(nome = u.username)
                anuncios = Anuncio.objects.filter(usuario__exact=usuario)
                quantidadeAnuncio = anuncios.count()
                #if u.blog_set.get():
                #    temblog = 1
                ultimos = Anuncio.objects.all().order_by('-dataCadastro')[:3]
                noticias = Noticias.objects.all().order_by('-publicacao')[:3]
                tagRecomenda = TagBusca.objects.filter(taganuncio__in = TagAnuncio.objects.all()).order_by('-quantidade')[:1]
                recomendado = TagBusca.objects.get(id = tagRecomenda)
                recomendados = Anuncio.objects.filter(taganuncio__tag__exact = recomendado)[:3]
                return render_to_response('meu_perfil.html', locals(), context_instance=RequestContext(request))
        else:
            return HttpResponseRedirect('/home/')
    return render_to_response('meu_perfil.html', locals(), context_instance=RequestContext(request))


def sair(request):
    logout(request)
    return redirect('/home/')

@login_required
def meusAnuncios(request, usuario_id):
    
    anuncios = Anuncio.objects.filter(usuario__exact=usuario_id)
    listaCidades = listagemCidades(request)
    usuario = Usuario.objects.get(id = usuario_id)
    quantidadeAnuncio = anuncios.count()
    ultimos = Anuncio.objects.all().order_by('-dataCadastro')[:3]
    noticias = Noticias.objects.all().order_by('-publicacao')[:3]
    tagRecomenda = TagBusca.objects.filter(taganuncio__in = TagAnuncio.objects.all()).order_by('-quantidade')[:1]
    recomendado = TagBusca.objects.get(id = tagRecomenda)
    recomendados = Anuncio.objects.filter(taganuncio__tag__exact = recomendado)[:3]
    
    return render_to_response('meus_anuncios.html', locals(), context_instance=RequestContext(request))

@login_required
@csrf_protect
def gerenciaAnuncios(request, usuario_id):
    
    listaCidades = listagemCidades(request)
    usuario = Usuario.objects.get(id = usuario_id)
    anuncios = Anuncio.objects.filter(contrato__blog__user__exact=usuario_id).distinct()
    anunciosVendidos = Anuncio.objects.filter(contrato__blog__user__exact=usuario_id).filter(status__exact = 3).distinct()
    quantidadeAnuncio = anunciosVendidos.count()
    ultimos = Anuncio.objects.all().order_by('-dataCadastro')[:3]
    noticias = Noticias.objects.all().order_by('-publicacao')[:3]
    tagRecomenda = TagBusca.objects.filter(taganuncio__in = TagAnuncio.objects.all()).order_by('-quantidade')[:1]
    recomendado = TagBusca.objects.get(id = tagRecomenda)
    recomendados = Anuncio.objects.filter(taganuncio__tag__exact = recomendado)[:3]
    if request.method == 'POST':
        acao = int(request.POST['acao'])
        for check in request.POST.getlist('check_msg'):
            id_anun = int(check)
            anun = Anuncio.objects.get(id = id_anun)
            if acao == 1:
                anun.status = 3
                anun.save()
            if acao == 0:
                anun.status = 1
                anun.save()
    
    return render_to_response('listar_anuncios.html', locals(), context_instance=RequestContext(request))

def termos(request):
    listaCidades = listagemCidades(request)
    publicidadeGigante = Publicidade.objects.filter(tipo__exact = 3)[:3]

    return render_to_response('termos.html', locals(), context_instance=RequestContext(request))

def denuncia(request):
    listaCidades = listagemCidades(request)
    publicidadeGigante = Publicidade.objects.filter(tipo__exact = 3)[:3]
    
    return render_to_response('denuncie.html', locals(), context_instance=RequestContext(request))

def duvidas(request):
    listaCidades = listagemCidades(request)
    publicidadeGigante = Publicidade.objects.filter(tipo__exact = 3)[:3]
    
    return render_to_response('duvidas.html', locals(), context_instance=RequestContext(request))

@csrf_protect
def faleconosco(request):
    listaCidades = listagemCidades(request)
    publicidadeGigante = Publicidade.objects.filter(tipo__exact = 3)[:3]
    if request.method == 'POST':
        nome = request.POST['nome']
        email = request.POST['email']
        assunto = request.POST['assunto']
        mensagem = request.POST['mensagem']
        html_content = "<br> Nome: "+nome+"</br>"+"<br> email: "+email+"</br>"+"<br> Assunto: "+assunto+"</br>"+"<br> Mensagem: "+mensagem+"</br>"
        msge = EmailMessage('Mensagem Fale Conosco!',html_content,'anuncio.classi180@gmail.com', ['anuncio.classi180@gmail.com',] )
        msge.content_subtype = "html"
        msge.send()
        return render_to_response('mensagem_enviada.html', locals(), context_instance=RequestContext(request))
        
    return render_to_response('faleconosco.html', locals(), context_instance=RequestContext(request))

@csrf_protect
def contatarAnunciante(request,usuario_id):
    listaCidades = listagemCidades(request)
    publicidadeGigante = Publicidade.objects.filter(tipo__exact = 3)[:3]
    if request.method == 'POST':
        usuario = Usuario.objects.get(id = usuario_id)
        nome = request.POST['nome']
        email = request.POST['email']
        assunto = request.POST['assunto']
        mensagem = request.POST['mensagem']
        html_content = "<br> Nome: "+nome+"</br>"+"<br> email: "+email+"</br>"+"<br> Assunto: "+assunto+"</br>"+"<br> Mensagem: "+mensagem+"</br>"
        msge = EmailMessage('Contatar o anunciante!',html_content,'anuncio.classi180@gmail.com', ['anuncio.classi180@gmail.com', usuario.email] )
        msge.content_subtype = "html"
        msge.send()
        return render_to_response('mensagem_enviada.html', locals(), context_instance=RequestContext(request))
        
    return render_to_response('faleconosco.html', locals(), context_instance=RequestContext(request))

def mensagens(request, usuario_id, anuncio_id):
    usuario = Usuario.objects.get(id = usuario_id)
    listaCidades = listagemCidades(request)
    user = User.objects.get(email = usuario.email)
    anuncio = Anuncio.objects.get(id = anuncio_id)
    ultimos = Anuncio.objects.all().order_by('-dataCadastro')[:3]
    noticias = Noticias.objects.all().order_by('-publicacao')[:3]
    tagRecomenda = TagBusca.objects.filter(taganuncio__in = TagAnuncio.objects.all()).order_by('-quantidade')[:1]
    recomendado = TagBusca.objects.get(id = tagRecomenda)
    recomendados = Anuncio.objects.filter(taganuncio__tag__exact = recomendado)[:3]
    ultimo = Comment.objects.filter(content_type__exact = 14).filter(object_pk__exact = anuncio_id).latest('submit_date')
    comentariosAnuncio = Comment.objects.filter(content_type__exact = 14).filter(object_pk__exact = anuncio_id)
    
    
    return render_to_response('mensagem.html', locals(), context_instance=RequestContext(request))

def minhasmensagens(request, usuario_id):
    
    usuario = Usuario.objects.get(id = usuario_id)
    anuncios = Anuncio.objects.filter(usuario__exact=usuario_id)
    ultimos = Anuncio.objects.all().order_by('-dataCadastro')[:3]
    listaCidades = listagemCidades(request)
    noticias = Noticias.objects.all().order_by('-publicacao')[:3]
    tagRecomenda = TagBusca.objects.filter(taganuncio__in = TagAnuncio.objects.all()).order_by('-quantidade')[:1]
    recomendado = TagBusca.objects.get(id = tagRecomenda)
    recomendados = Anuncio.objects.filter(taganuncio__tag__exact = recomendado)[:3]
    ids = anuncios.values_list('id', flat = True)
    comentarios = []
    users = []
    quantidadeNaoLida = 0
    for anuncio in ids:
        comentario = Comment.objects.filter(content_type__exact = 14).filter(object_pk__exact = anuncio).order_by('-id')[:1]
        #co = comentario.values_list('user',flat=True)
        #use = User.objects.get(id__contains = co)
        #FotoUsuario = Usuario.objects.get(email = use.email)
        if comentario:
            comentarios.append(comentario)
            #users.append(FotoUsuario)
    return render_to_response('minhas_mensagens.html', locals(), context_instance=RequestContext(request))

def contatar(request, usuario_id):
    
    if request.mothod == 'POST':
        email = Usuario.objects.get(id = usuario_id).email
        html_content = request.POST['content']
        msge = EmailMessage('Classi180 tem mensagem para voce!',html_content,'caioguri@gmail.com', [email, ] )
        msge.content_subtype = "html"
        msge.send()

def cadastrar(request):
    pass

def avaliar(request, usuario_id):
    nota = int(request.GET['avaliacao'])
    usuario = Usuario.objects.get(id = usuario_id)
    try:
        usuario2 = Usuario.objects.get(email = request.user.email)
    except:
        usuario2 = Usuario.objects.get(nome = request.user.username)
    if nota >=3:
        avaliacaoUser = AvaliacaoUsuario(avaliado = usuario, avaliacaoPositiva = True, avaliacaoNegativa = False, avaliador = usuario2, media = nota)
    else:
        avaliacaoUser = AvaliacaoUsuario(avaliado = usuario, avaliacaoPositiva = False, avaliacaoNegativa = True, avaliador = usuario2, media = nota)
    avaliacaoUser.save()
    usuario = Usuario.objects.get(id = usuario_id)
    anuncios = Anuncio.objects.filter(usuario__exact=usuario_id)
    ultimos = Anuncio.objects.all().order_by('-dataCadastro')[:3]
    noticias = Noticias.objects.all().order_by('-publicacao')[:3]
    quantidadeAnuncios = anuncios.count()
        
    return render_to_response('perfil.html', locals(), context_instance=RequestContext(request))

def blog(request):
    listanoticias = Noticias.objects.all().order_by('-publicacao')
    listaCidades = listagemCidades(request)
    publicidadeGigante = Publicidade.objects.filter(tipo__exact = 3)[:3]
    paginator = Paginator(listanoticias, 10)

    try:
        page = int(request.GET.get('page', '1'))
    except ValueError:
        page = 1

    try:
        noticias = paginator.page(page)
    except (EmptyPage, InvalidPage):
        noticias = paginator.page(paginator.num_page)
    
    return render_to_response('blog.html', locals(), context_instance=RequestContext(request))

def buscaBlog(request):
    categoria = request.GET['categoria']
    listanoticias = Noticias.objects.filter(chamada__exact = categoria).order_by('-publicacao')
    listaCidades = listagemCidades(request)
    publicidadeGigante = Publicidade.objects.filter(tipo__exact = 3)[:3]
    paginator = Paginator(listanoticias, 10)

    try:
        page = int(request.GET.get('page', '1'))
    except ValueError:
        page = 1

    try:
        noticias = paginator.page(page)
    except (EmptyPage, InvalidPage):
        noticias = paginator.page(paginator.num_page)

    return render_to_response('blog.html', locals(), context_instance=RequestContext(request))

def buscaNoticia(request):
    tag = request.GET['busca']
    listanoticias = Noticias.objects.filter(titulo__icontains = tag).order_by('-publicacao')
    listaCidades = listagemCidades(request)
    publicidadeGigante = Publicidade.objects.filter(tipo__exact = 3)[:3]
    paginator = Paginator(listanoticias, 10)

    try:
        page = int(request.GET.get('page', '1'))
    except ValueError:
        page = 1

    try:
        noticias = paginator.page(page)
    except (EmptyPage, InvalidPage):
        noticias = paginator.page(paginator.num_page)
    return render_to_response('blog.html', locals(), context_instance=RequestContext(request))

def postblog(request, noticia_id):
    noticia = Noticias.objects.get(id = noticia_id)
    publicidadeGigante = Publicidade.objects.filter(tipo__exact = 3).order_by('-dataEntrada')[:1]
    listaCidades = listagemCidades(request)
    comentariosAnuncio = Comment.objects.filter(content_type__exact = 37).filter(object_pk__exact = noticia_id)
    coments = []
    for coment in comentariosAnuncio:
        comentComent = Comment.objects.filter(content_type__exact = 20).filter(object_pk__exact = coment.id)
        coments.append(comentComent)
    
    if request.method == 'POST':
        comentario = Comment(content_type_id = 37, object_pk = noticia_id, site_id = 2, user_id = request.user.id, user_name = request.user.username, user_email = request.user.email, comment = request.POST['comentText'], submit_date = datetime.date.today(), is_public = 1, is_removed = 0)
        comentario.save()
    return render_to_response('post_blog.html', locals(), context_instance=RequestContext(request))

def publicidades(request, quantidade):
    publicidades = Anuncio.objects.filter(status__exact=3).order_by('-dataCadastro')[:quantidade]
    return render_to_response('barraclassi180.html', locals(), context_instance=RequestContext(request))

def publicidades_blog(request, blog,quantidade):
    publicidades = Anuncio.objects.filter(status__exact=3).filter(contrato__blog__nome__iexact = blog).order_by('-dataCadastro')[:quantidade]
    return render_to_response('barraclassi180.html', locals(), context_instance=RequestContext(request))

def buscapublicidades(request, quantidade):
    publicidade = Anuncio.objects.filter(status__exact=3).filter(descricao__icontains = request.GET['busca']).order_by('-dataCadastro')
    if publicidade.count() < int(quantidade):
        qtd = int(quantidade) - publicidade.count()
        publiExtra = Anuncio.objects.filter(status__exact=3).exclude(id__in = publicidade.values_list('id', flat = True))[:qtd]
        publicidades = itertools.chain(publicidades, publiExtra)
    else:
        publicidades = publicidade[:quantidade]
    return render_to_response('barraclassi180.html', locals(), context_instance=RequestContext(request))

def classi(request, quantidade):
    publicidades = Anuncio.objects.filter(status__exact=3).order_by('-dataCadastro')[:quantidade]
    return render_to_response('publicidades-classi180.html', locals(), context_instance=RequestContext(request))

def classi_continue(request, inicio, fim):
    publicidades = Anuncio.objects.filter(status__exact=3).order_by('-dataCadastro')[inicio:fim]
    '''if publicidade.count() < int(fim):
        qtd = int(fim) - publicidade.count()
        publiExtra = Anuncio.objects.filter(status__exact=3).exclude(id__in = publicidade.values_list('id', flat = True))[:qtd]
        publicidades = itertools.chain(publicidade,publiExtra)
    else:
        publicidades = publicidade[:fim]'''
    return render_to_response('publicidades-classi180.html', locals(), context_instance=RequestContext(request))

def classi_horizontal(request, quantidade):
    publicidades = Anuncio.objects.filter(status__exact=3).order_by('-dataCadastro')[:quantidade]
    words = TagBusca.objects.order_by('-quantidade').distinct()[7:14]
    return render_to_response('publicidades3-classi180.html', locals(), context_instance=RequestContext(request))

def busca_classi(request, quantidade):
    publicidades = Anuncio.objects.filter(status__exact=3).filter(descricao__icontains = request.GET['busca']).order_by('-dataCadastro')
    words = TagBusca.objects.order_by('-quantidade').distinct()[7:14]
    if publicidades.count() < quantidade:
        qtd = int(quantidade) - publicidades.count()
        publiExtra = Anuncio.objects.filter(status__exact=3).exclude(id__in = publicidades.values_list('id', flat = True))[:qtd]
        publicidades = itertools.chain(publicidades,publiExtra)
    return render_to_response('publicidades3-classi180.html', locals(), context_instance=RequestContext(request))

def classi2(request, quantidade):
    publicidades = Anuncio.objects.filter(status__exact=3).order_by('-dataCadastro')[:quantidade]
    return render_to_response('publicidades2-classi180.html', locals(), context_instance=RequestContext(request))

def classi2_blog(request, blog,quantidade):
    publicidades = Anuncio.objects.filter(status__exact=3).filter(contrato__blog__nome__iexact = blog).order_by('-dataCadastro')[:quantidade]
    return render_to_response('publicidades2-classi180.html', locals(), context_instance=RequestContext(request))

def classi_blog(request, blog, quantidade):
    publicidades = Anuncio.objects.filter(status__exact=3).filter(contrato__blog__nome__iexact = blog).order_by('-dataCadastro')[:quantidade]
    return render_to_response('publicidades-classi180.html', locals(), context_instance=RequestContext(request))

def get_subcategoria(request):
    subCategorias = SubCategoria.objects.all()
    retorno = serializers.serialize("json",  subCategorias)
    return HttpResponse(retorno, mimetype="text/javascript")

def listagemCidades(request):
    listaCidades = Cidade.objects.filter(estado__exact = 'PI').order_by('nome')   
    return listaCidades

def currency(preco):
    preco = preco.intcomma
    return "%s" % (intcomma(int(preco)))

class MyIntellect(Intellect):

    if __name__ == "__main__":

            try:
                # tune down logging inside Intellect
                logger = logging.getLogger('intellect')
                logger.setLevel(logging.DEBUG) # change this to ERROR for less output
                consoleHandler = logging.StreamHandler(stream=sys.stdout)
                consoleHandler.setFormatter(logging.Formatter('%(asctime)s %(name)-12s %(levelname)-8s%(message)s'))
                logger.addHandler(consoleHandler)
            
                # set up logging for the example
                logger = logging.getLogger('example')
                logger.setLevel(logging.DEBUG)
            
                consoleHandler = logging.StreamHandler(stream=sys.stdout)
                consoleHandler.setFormatter(logging.Formatter('%(asctime)s %(name)-12s %(levelname)-8s%(message)s'))
                logger.addHandler(consoleHandler)
            except Exception as e:
                traceback.print_exc(limit=sys.getrecursionlimit(), file=sys.stdout)